<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>函数</title>
		<link rel="stylesheet" type="text/css" href="css/reset.css"/>
		<link rel="stylesheet" type="text/css" href="css/common.css"/>
	</head>
	<body>
		<div class="web">
			<h1>函数介绍</h1>
			<hr />
			<h2>函数</h2>
			<p>函数是一段JavaScript代码组成的"功能块",它定义一次,但可以被反复调用多次.</p>
			<p>JavaScript函数是参数化的,函数定义会包括一个称为"形参"的标识符列表,这些参数在函数体中像局部变量一样工作.函数调用时会为形参提供"实参"值.</p>
			<p>如果函数挂载到一个对象上,就称为对象的方法,用于初始化一个新建对象的函数称为"构造函数".</p>
			
			<details>
				<summary>全局函数介绍</summary>
				<ul>
					<li>全局属性和函数可用于所有内建的 JavaScript 对象。</li>
					<li><h4>eval()</h4></h4>
					<li>eval()计算JavaScript字符串,并把它作为脚本代码来执行,返回值是字符串的计算结果(如果有的话).</li>
					<li>eval()不利于JavaScript解释器的优化,谨慎使用!</li>
					<li><h4>isNaN(x)</h4></li>
					<li>isNaN() 函数用于检查其参数是否是非数字值。</li>
					<li>如果 x 是特殊的非数字值 NaN（或者能被转换为这样的值），返回的值就是 true。如果 x 是其他值,则返回 false。</li>
					<li>如果把 NaN 与任何值（包括其自身）相比得到的结果均是 false，所以要判断某个值是否是 NaN，不能使用 == 或 === 运算符。正因为如此，isNaN() 函数是必需的。</li>
					<li><h4>parseInt(string, radix)</h4></li>
					<li>parseInt() 函数可解析一个字符串，并返回一个整数。</li>
					<li>开头和结尾的空格是允许的。</li>
					<li><h4>parseFloat()</h4></li>
					<li>parseFloat() 函数可解析一个字符串，并返回一个浮点数。</li>
					<li>该函数指定字符串中的首个字符是否是数字。如果是，则对字符串进行解析，直到到达数字的末端为止，然后以数字返回该数字，而不是作为字符串。</li>
					<li>
						定时器:var t1 = setTimeout()与 var t2 = setInterval()
						<p>区别:</p>
						<p>setTimeout(function(){},1000),在1000ms后只会执行一次,而setInterval(function(){},1000),则会每隔1000s执行一次</p>
						<p>
							清除定时器:clearTimeout(t1) <br />
									clearInterval(t2)
						</p>
					</li>
					<li>
						alert()                 弹出窗
						confirm("提示语")         点击确定返回true 取消返回false
						prompt("提示语","默认值")   可以接受用户的输入
					</li>
				</ul>
			</details>
			<details>
				<summary>函数自定义与参数</summary>
				<ul>
					<li>形参与实参/arguments对象</li>
					<li>实参与形参个数可以有偏差，不会因为参数不统一而错误。</li>
					<li>期望参数的使用。</li>
					<li>实际传递参数的使用arguments</li>
					<li>没有传递值的命名参数将自动赋予undefined</li>
					<li>超过的参数直接忽略</li>
				</ul>
			</details>
			
			<details>
				<summary>变量作用域</summary>
				<ul>
					<li>在函数中使用var关键字进行显式申明的变量是做为局部变量，而没有用var关键字，使用直接赋值方式声明的是全局变量。</li>
					<li>当我们使用访问一个没有声明的变量时，JS会报错。而当我们给一个没有声明的变量赋值时，JS不会报错，相反它会认为我们是要隐式申明一个全局变量，这一点一定要注意。</li>
					<li>局部变量只在函数执行时生成的调用对象中存在，函数执行完毕时局部变量即刻销毁。因此在程序设计中我们需要考虑如何合理声明变量，这样既减小了不必要的内存开销，同时能很大程度地避免变量重复定义而覆盖先前定义的变量</li>
					<li>下面语句分别打印输出什么?
				<pre>
					var tem = "全局变量";
					function(){
						console.log(tem);
						var tem = "局部变量";//声明提前
						console.log(tem);
					}
				</pre>
					</li>
					<li>为了避免上面的这类问题，因此在函数开始位置集中做函数声明是一个极力推荐的做法。 </li>
					<li></li>
				</ul>
			</details>
			<details>
				<summary>return</summary>
				<ul>
					<li>一个函数内处理的结果可以使用return 返回，
这样在调用函数的地方就可以用变量接收返回结果。</li>
					<li>return 关键字内任何类型的变量数据或表达式
都可以进行返回，甚至什么都不返回也可以</li>
					<li>return并不是函数必须的,但调用表达式的结果是undefined</li>
					<li>return不一定要放在函数体后面,但return后面的语句不会执行,所以有的时候return 的作用就是用来终止函数执行。</li>
					<li></li>
				</ul>
			</details>
			
			
			<details>
				<summary>函数调用</summary>
				<ul>
					<li>作为函数</li>
					<li>作为方法</li>
					<li>作为构造函数</li>
					<li>通过他们的call()和apply()方法间接调用</li>
					<li></li>
					<li>作为值时可以使用return,可以省略名字</li>
					<li>初步了解call(),apply(),bind()方法</li>
				</ul>
			</details>
			<details>
				<summary>函数递归</summary>
				<ul>
					<li>说白了，递归就是函数自己内部调用自己</li>
					<li>使用递归函数一定要注意，处理不当就会进入死循环。</li>
					<li>
						<pre>
			var f = function (x) {  
			    if (x === 1) {  
			        return 1;  
			    } else {  
			        return x * f(x - 1);  
			    }  
			}; 
						</pre>
					</li>
					<li><img src="img/阶乘.png"/></li>
				</ul>
			</details>
			<details>
				<summary>匿名函数(使用场景回调函数)</summary>
				<ul>
					<li>function 函数名(参数列表){函数体;} <br />	
					创建匿名函数，那就应该是：function(){函数体;}

</li>
					<li>匿名函数在声明时不用带上函数名, 可以把匿名函数当作一个function类型的值来对待,可以把它赋值给一个变量</li>
					
					<li>匿名函数主要有两种常用的场景，一是回调函数，二是直接执行函数。</li>
					<li>最经常用作回调函数(callback)参数的值</li>
					<li>有return表达式时用于赋值</li>
					<li></li>
					<li></li>
				</ul>
			</details>
			<!--<div class="test">111</div>-->
			<script type="text/javascript">
				var test = document.querySelector(".test");
//				test.index = "nini"
				var s = "string";
				s.s = "nihao";
				var arr = [1,2,3]
				arr[0] = 4;
				arr.s = "nihao2"
//				alert(arr);
//				alert(arr.s);
				var x = 13.14;
				
				function abc(a,b,c,d){
					console.log(arguments);
				}
				abc(1,2,3,4);
				console.log()
				console.log(abc.length);
				var x = 1;
				function jiecheng(a){
					if(a == 1){return 1}
					return a*jiecheng(a-1)
					
					
				}
				console.log(jiecheng(3));
				//setTimeout(function(){alert(111)},1000)
			</script>
			
			
							
			
			
			
		</div>
		
	</body>
</html>
